Clean up height code a bit. I don't think it's completely correct yet, but
authorJonathan Blandford <jrb@redhat.com>
Fri, 2 Nov 2001 21:47:27 +0000 (21:47 +0000)
committerJonathan Blandford <jrb@src.gnome.org>
Fri, 2 Nov 2001 21:47:27 +0000 (21:47 +0000)
Fri Nov  2 16:45:17 2001  Jonathan Blandford  <jrb@redhat.com>

* gtk/gtkrbtree.c (_gtk_rbtree_remove_node): Clean up height code
a bit.  I don't think it's completely correct yet, but it's
getting there.

ChangeLog
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
gtk/gtkrbtree.c
gtk/gtktreeview.c
gtk/gtktreeview.h

index 848d5ff066cb336c68ebc4c632071ff7de90b9d6..b1f93fd1187efb84d3cae4f2589648447a03b7b3 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Fri Nov  2 16:45:17 2001  Jonathan Blandford  <jrb@redhat.com>
+
+       * gtk/gtkrbtree.c (_gtk_rbtree_remove_node): Clean up height code
+       a bit.  I don't think it's completely correct yet, but it's
+       getting there.
+
 Fri Nov  2 16:14:15 2001  Owen Taylor  <otaylor@redhat.com>
 
        * gtk/gtkviewport.c (gtk_viewport_size_request): Remove
index 848d5ff066cb336c68ebc4c632071ff7de90b9d6..b1f93fd1187efb84d3cae4f2589648447a03b7b3 100644 (file)
@@ -1,3 +1,9 @@
+Fri Nov  2 16:45:17 2001  Jonathan Blandford  <jrb@redhat.com>
+
+       * gtk/gtkrbtree.c (_gtk_rbtree_remove_node): Clean up height code
+       a bit.  I don't think it's completely correct yet, but it's
+       getting there.
+
 Fri Nov  2 16:14:15 2001  Owen Taylor  <otaylor@redhat.com>
 
        * gtk/gtkviewport.c (gtk_viewport_size_request): Remove
index 848d5ff066cb336c68ebc4c632071ff7de90b9d6..b1f93fd1187efb84d3cae4f2589648447a03b7b3 100644 (file)
@@ -1,3 +1,9 @@
+Fri Nov  2 16:45:17 2001  Jonathan Blandford  <jrb@redhat.com>
+
+       * gtk/gtkrbtree.c (_gtk_rbtree_remove_node): Clean up height code
+       a bit.  I don't think it's completely correct yet, but it's
+       getting there.
+
 Fri Nov  2 16:14:15 2001  Owen Taylor  <otaylor@redhat.com>
 
        * gtk/gtkviewport.c (gtk_viewport_size_request): Remove
index 848d5ff066cb336c68ebc4c632071ff7de90b9d6..b1f93fd1187efb84d3cae4f2589648447a03b7b3 100644 (file)
@@ -1,3 +1,9 @@
+Fri Nov  2 16:45:17 2001  Jonathan Blandford  <jrb@redhat.com>
+
+       * gtk/gtkrbtree.c (_gtk_rbtree_remove_node): Clean up height code
+       a bit.  I don't think it's completely correct yet, but it's
+       getting there.
+
 Fri Nov  2 16:14:15 2001  Owen Taylor  <otaylor@redhat.com>
 
        * gtk/gtkviewport.c (gtk_viewport_size_request): Remove
index 848d5ff066cb336c68ebc4c632071ff7de90b9d6..b1f93fd1187efb84d3cae4f2589648447a03b7b3 100644 (file)
@@ -1,3 +1,9 @@
+Fri Nov  2 16:45:17 2001  Jonathan Blandford  <jrb@redhat.com>
+
+       * gtk/gtkrbtree.c (_gtk_rbtree_remove_node): Clean up height code
+       a bit.  I don't think it's completely correct yet, but it's
+       getting there.
+
 Fri Nov  2 16:14:15 2001  Owen Taylor  <otaylor@redhat.com>
 
        * gtk/gtkviewport.c (gtk_viewport_size_request): Remove
index 848d5ff066cb336c68ebc4c632071ff7de90b9d6..b1f93fd1187efb84d3cae4f2589648447a03b7b3 100644 (file)
@@ -1,3 +1,9 @@
+Fri Nov  2 16:45:17 2001  Jonathan Blandford  <jrb@redhat.com>
+
+       * gtk/gtkrbtree.c (_gtk_rbtree_remove_node): Clean up height code
+       a bit.  I don't think it's completely correct yet, but it's
+       getting there.
+
 Fri Nov  2 16:14:15 2001  Owen Taylor  <otaylor@redhat.com>
 
        * gtk/gtkviewport.c (gtk_viewport_size_request): Remove
index 848d5ff066cb336c68ebc4c632071ff7de90b9d6..b1f93fd1187efb84d3cae4f2589648447a03b7b3 100644 (file)
@@ -1,3 +1,9 @@
+Fri Nov  2 16:45:17 2001  Jonathan Blandford  <jrb@redhat.com>
+
+       * gtk/gtkrbtree.c (_gtk_rbtree_remove_node): Clean up height code
+       a bit.  I don't think it's completely correct yet, but it's
+       getting there.
+
 Fri Nov  2 16:14:15 2001  Owen Taylor  <otaylor@redhat.com>
 
        * gtk/gtkviewport.c (gtk_viewport_size_request): Remove
index 82768e7cfaa8db515bc00a774ad8fb997f37a654..9b0aaf5047b38787fc37957590a909cb5a659d99 100644 (file)
@@ -1055,6 +1055,8 @@ _gtk_rbtree_remove_node (GtkRBTree *tree,
   GtkRBNode *x, *y;
   GtkRBTree *tmp_tree;
   GtkRBNode *tmp_node;
+  gint node_height;
+  gint y_height;
   
   g_return_if_fail (tree != NULL);
   g_return_if_fail (node != NULL);
@@ -1066,7 +1068,8 @@ _gtk_rbtree_remove_node (GtkRBTree *tree,
 
   if (gtk_debug_flags & GTK_DEBUG_TREE)
     _gtk_rbtree_test (G_STRLOC, tree);
-  
+
+
   if (node->left == tree->nil || node->right == tree->nil)
     {
       y = node;
@@ -1086,15 +1089,17 @@ _gtk_rbtree_remove_node (GtkRBTree *tree,
   /*   y->count = node->count; */
 
   /* offsets and parity adjust all the way up through parent trees */
-  
+  y_height = GTK_RBNODE_GET_HEIGHT (y);
+  node_height = GTK_RBNODE_GET_HEIGHT (node) + (node->children?node->children->root->offset:0);
+
+  /* Do this twice for code clarities sake. */
   tmp_tree = tree;
   tmp_node = y;
-
   while (tmp_tree && tmp_node && tmp_node != tmp_tree->nil)
     {
-      /*       tmp_node->offset -= y->offset; */
-      tmp_node->parity -= (guint) 1; /* parity of y is always 1 */
-      
+      tmp_node->offset -= (y_height + (y->children?y->children->root->offset:0));
+      tmp_node->parity -= (1 + (y->children?y->children->root->parity:0));
+
       tmp_node = tmp_node->parent;
       if (tmp_node == tmp_tree->nil)
        {
@@ -1102,7 +1107,7 @@ _gtk_rbtree_remove_node (GtkRBTree *tree,
          tmp_tree = tmp_tree->parent_tree;
        }
     }
-  
+
   /* x is y's only child */
   if (y->left != tree->nil)
     x = y->left;
@@ -1121,12 +1126,35 @@ _gtk_rbtree_remove_node (GtkRBTree *tree,
 
   if (y != node)
     {
+      gint diff;
+
       /* Copy the node over */
       if (GTK_RBNODE_GET_COLOR (node) == GTK_RBNODE_BLACK)
        node->flags = ((y->flags & (GTK_RBNODE_NON_COLORS)) | GTK_RBNODE_BLACK);
       else
        node->flags = ((y->flags & (GTK_RBNODE_NON_COLORS)) | GTK_RBNODE_RED);
       node->children = y->children;
+
+      /* We want to see how different our height is from the previous node.
+       * To do this, we compare our current height with our supposed height.
+       */
+      diff = y_height - GTK_RBNODE_GET_HEIGHT (node);
+      if (diff != 0)
+       {
+         tmp_tree = tree;
+         tmp_node = node;
+
+         while (tmp_tree && tmp_node && tmp_node != tmp_tree->nil)
+           {
+             tmp_node->offset += diff;
+             tmp_node = tmp_node->parent;
+             if (tmp_node == tmp_tree->nil)
+               {
+                 tmp_node = tmp_tree->parent_node;
+                 tmp_tree = tmp_tree->parent_tree;
+               }
+           }
+       }
     }
 
   if (GTK_RBNODE_GET_COLOR (y) == GTK_RBNODE_BLACK)
index a19cb42900293392c4e57cdd5d3aa3bcf938e9b3..0673330bd7641e80f043ecf5a8f72fa34f838838 100644 (file)
@@ -3012,7 +3012,7 @@ gtk_tree_view_focus_out (GtkWidget     *widget,
 }
 
 /* Incremental Reflow */
-#if 0
+
 static void
 validate_visible_area (GtkTreeView *tree_view)
 {
@@ -3045,7 +3045,7 @@ install_presize_handler (GtkTreeView *tree_view)
 {
 
 }
-#endif
+
 /* Drag-and-drop */
 
 static void
index ee70438859c9b635a0d09f6b51acf074bbacd3fd..8fbd7efd7c9870e3e458e4f29e45ee8533356136 100644 (file)
@@ -312,8 +312,6 @@ void gtk_tree_view_set_destroy_count_func (GtkTreeView             *tree_view,
                                           GtkDestroyNotify         destroy);
 
 
-
-
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */